/**
 * Copyright (c) 2007,中企动力华南研发中心
 * All rights reserved.
 */
package com.ce.pms.house.service.impl;

import java.util.HashSet;
import java.util.Set;

import com.ce.pms.base.service.impl.PmsBaseServiceImpl;
import com.ce.pms.common.model.SysInfo;
import com.ce.pms.common.util.UpLoadFile;
import com.ce.pms.house.dao.IImageDao;
import com.ce.pms.house.model.ImageDomain;
import com.ce.pms.house.service.IImageService;
import com.ce.pms.house.vo.ImageVO;
import com.ce.util.BlankUtil;
import com.ce.webframework.exception.BizLayerException;

/**
 * 功能描述：
 * @author 罗军林 创建日期：2008-6-27
 */
public class ImageServiceImpl extends PmsBaseServiceImpl implements IImageService{
	IImageDao imageDao;

	public Long addImage(ImageVO imageVO) {
		ImageDomain imageDomain = converVoToDomain(imageVO);
		imageDao.saveObject(imageDomain);
		return imageDomain.getKeyword();
	}

	/** 功能描述:将Do转换成VO
	 * @param imageDomain
	 * @return
	 * Create author:罗军林
	 * Create on:2008-6-27
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public ImageVO convertDomainToVo(ImageDomain imageDomain) {
		if(BlankUtil.isBlank(imageDomain)){
			return null;
		}
		ImageVO imageVO=new ImageVO();
		imageVO.setId(imageDomain.getKeyword());
		imageVO.setName(imageDomain.getName());
		imageVO.setPath(imageDomain.getPath());
		imageVO.setCreator(imageDomain.getSysInfo().getCreator());
		return imageVO;
	}

	/** 功能描述:将Vo转换成DO
	 * @param imageVO
	 * @return
	 * Create author:罗军林
	 * Create on:2008-6-27
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	public ImageDomain converVoToDomain(ImageVO imageVO) {
		if(imageVO != null){
			ImageDomain imageDomain = wangleDomainInstance(imageVO);
			imageDomain.setName(imageVO.getName());
			imageDomain.setPath(imageVO.getPath());
			return imageDomain;
		}

		return null;
	}

	public void deleteImageByID(Long id) {
		checkID(id);
		imageDao.deleteObjectById(id);
	}

	public void editImage(ImageVO imageVO) {
		checkID(imageVO.getId());
		ImageDomain imageDomain=converVoToDomain(imageVO);
		imageDao.updateObject(imageDomain);
	}

	public ImageVO findImageByID(Long id) {
		checkID(id);
		ImageDomain imageDomain=imageDao.findById(id);
		ImageVO imageVO = convertDomainToVo(imageDomain);
		return imageVO;
	}

	/**********get/set方法********************/
	public IImageDao getImageDao() {
		return imageDao;
	}

	public void setImageDao(IImageDao imageDao) {
		this.imageDao = imageDao;
	}

	/**
	 * 功能描述: 对多个图片进行处理 <br>
	 *
	 * @link com.ce.pms.house.service.impl.ImageServiceImpl#processImage(ImageVO)
	 * @param imageVos
	 * @param operator
	 * @return Set<ImageDomain>
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-8-5  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public Set<ImageDomain> processImageSet(Set<ImageVO> imageVos,Long operator){
		super.checkCreatorInfo(operator);
		Set<ImageDomain> imageDos =  new HashSet<ImageDomain>();
		if (!BlankUtil.isBlank(imageVos)) {
			for (ImageVO imageVO : imageVos) {
				imageDos.add(this.getPossibleImageDomain(imageVO,operator));
			}
			imageDos.remove(null);
		}

		return imageDos;
	}

	/**
	 * 功能描述: 得到一个可能的图片Domain，
	 * 针参数imageVo未设操作者id的情况，
	 * 调用getPossibleImageDomain(ImageVO imageVo)方法 <br>
	 * @param imageVo
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-8-5  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	public ImageDomain getPossibleImageDomain(ImageVO imageVo,Long operator) {
		if (!BlankUtil.isBlank(imageVo)) {
			super.checkCreatorInfo(operator);
			imageVo.setCreator(operator);
			return this.getPossibleImageDomain(imageVo);
		}
		return null;
	}

	/**
	 * 功能描述: 得到一个可能的图片Domain，
	 * 所得到的返回值图片VO如果id不为空，使用findById得到一个实体 <br>
	 * @param imageVo
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-8-5  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	*/
	public ImageDomain getPossibleImageDomain(ImageVO imageVo) {
		ImageDomain imageDo = null;
		if (!BlankUtil.isBlank(imageVo)) {
			imageVo = this.processImage(imageVo);
			if (!BlankUtil.isBlank(imageVo.getId())) {
				imageDo = this.imageDao.findById(imageVo.getId());
			}
		}

		return imageDo;
	}

/**********私有方法*******************/
	/**
	 * 功能描述:如果id为空,则抛出异常
	 * @param id
	 * Create author:罗军林
	 * Create on:2008-6-27
	 * Edit author:
	 * Edit on:
	 * Why:
	 */
	private void checkID(Long id){
		if(id==null){
			throw new BizLayerException("ID不能为空！");
		}
	}

	/** 功能描述: 设法得到一个图片Domain对象，从传入VO参数的id字段判断，
	 * id为空则实例化一个新的图片Domain，否则从系统查询一个出来。 <br>
	 * @param imageVO
	 * @return
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-8-5  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	*/
	private ImageDomain wangleDomainInstance(ImageVO imageVO) {
		ImageDomain imageDomain = null;
		if (imageVO.getId()!=null) {
			imageDomain=this.imageDao.findById(imageVO.getId());
			SysInfo info = imageDomain.getSysInfo();
			super.modifyInfo(info, imageVO.getCreator());
		}else{
			imageDomain=new ImageDomain();
			imageDomain.setSysInfo(this.createInfo(imageVO.getCreator()));
		}
		return imageDomain;
	}

	/**
	 * 功能描述:  根据传入的参数值对图片进行操作，规则如下： <br>
	 * <ul>
	 * <li>如果imageVo为空，直接返回。
	 * <li>如果imageVo的名称和路径值不为空值，但没有id，则进行新增操作
	 * <li>如果imageVo的名称和路径值不为空值，但有id，则进行修改操作
	 * <li>如果imageVo只有id，进行删除操作（包括删除图片文件和数据库表记录）
	 * </ul>
	 *
	 * @param imageVo
	 * @return ImageVO
	 *
	 * Create author:付湘辉 <br>
	 * Create on:2008-7-15  <br>
	 * Edit author:  <br>
	 * Edit on:    <br>
	 * Why:     <br>
	 */
	private ImageVO processImage(ImageVO imageVo){
		if (BlankUtil.isBlank(imageVo)) {
			return null;
		}
		ImageVO resultImage = imageVo;
		if (!BlankUtil.isBlank(resultImage.getName())
			&& !BlankUtil.isBlank(resultImage.getPath())) {
			Long imageId = resultImage.getId();
			if (!BlankUtil.isBlank(imageId)) {//修改操作
				ImageVO tempImage = this.findImageByID(imageId);
				//图片名称不一样，进行修改
				if (!resultImage.getName().equals(tempImage.getName())) {
					UpLoadFile.deleteFile(tempImage);
					this.editImage(resultImage);
				}
			}else{
				//添加图片
				imageId = this.addImage(resultImage);

				//得到新增的图片id
				resultImage.setId(imageId);
			}
		}else if(!BlankUtil.isBlank(resultImage.getId())){//只传id，删除文件
			ImageVO tempImageVo = this.findImageByID(resultImage.getId());
			this.deleteImageByID(tempImageVo.getId());//从数据库删除图片
			UpLoadFile.deleteFile(tempImageVo);
			resultImage.setId(null);
		}
		return resultImage;
	}

}
